package bean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;


/**
 * Classe que gerencia os Grupos do Bolao
 * @author Claudio Cardoso, Daniel Leite, Lucas Sampaio, Matheus Sampaio
 * @version 1.0
 */


public class Grupo implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private List<Jogador> jogadores;
	private String senha;
	private String nome;
	private Jogador dono;
	
	//construtor
	public Grupo(String nome, Jogador dono){
        this.nome = nome;
		this.jogadores = new ArrayList<Jogador>();
        this.dono = dono;
	}
	

	/**
	 * Retorna todos Jogadores do Grupo
	 * @return
	 * 		Jogadores participantes do Grupo
	 */
	public List<Jogador> getJogadores() {
		return jogadores;
	}
	
	/**
	 * Adiciona um Jogador ao Grupo
	 * @param jogador
	 * 		Jogador adicionado ao Grupo
	 */
	public void adicionaJogador(Jogador jogador) {
		this.jogadores.add(jogador);
		Collections.sort(jogadores);
	}
	
	/**
	 * Remove um Jogador do Grupo
	 * @param jogador
	 * 		Parametro da Pesquisa
	 * @return
	 * 		Retorna o jogador, caso seja encontrado. Null, caso contrario
	 */
	public boolean removeJogador(Jogador jogador){
		for (Jogador other : jogadores) {
			if (other.getEmail().equals(jogador.getEmail())) {
				jogadores.remove(other);
				return true;
			}
		}
		return false;
	}
	

	/**
	 * Retorna o nome do Grupo
	 * @return
	 * 		Nome do Grupo
	 */
	public String getNome(){
		return nome;
	}
	
	/**
	 * Retorna o Dono do Grupo
	 * @return
	 * 		Dono do Grupo
	 */
	public Jogador getDono(){
		return dono;		
	}
	
	/**
	 * Modifica o Dono do Grupo
	 */
	public void setDono(Jogador dono){
		this.dono = dono;
	}
	
	/**
	 * Retorna a senha do Grupo
	 * @return
	 * 		Senha do Grupo
	 */
	public String getSenha() {
		return senha;
	}
	
	/**
	 * Modifica Senha de acesso ao Grupo, caso o Jogador Logado seja o Dono
	 * @param senha
	 * 		Nova Senha do Grupo
	 * @param jogador
	 * 		Jogador Logado
	 */
	public boolean setSenha(String senha, Jogador jogador) {
		if (jogador.equals(dono)){
			this.senha = senha;
			return true;
		}
		return false;
	}
	
	/**
	 * Caso o jogador seja o dono do grupo, retira a senha do Grupo, tornando-o public
	 * @param jogador 
	 * 		Jogador Dono do Grupo
	 * @return boolean
	 * 		True, se a senha for modificada com sucesso. False, caso contrario
	 */
	public boolean retiraSenha(Jogador jogador) {
		if (jogador.equals(dono)) {
			this.senha = null;
			return true;
		}
		return false;
	}
	
	/**
	 * Verifica o estado do Grupo: Aberto ou Fechado
	 * @return
	 * 		Retorna o estado
	 */
	public boolean isPublic() {
		if (senha == null) {
			return true;
		} else {
			return false;
		}
	}
	
	/**
	 * Gera as informacoes do Grupo
	 * @return
	 * 		Todas as informacoes sobre o Grupo
	 */
	public String toString() {
		String out = "";
		
		if (!isPublic()) {
			out += "Grupo (Privado): " + getNome() + "\n" +
				   "Dono: " + getDono().getNome() + "(" + getDono().getEmail() + ")" + "\n";
		} else {
			out += "Grupo (Publico): " + getNome() + "\n"; 
		}
		out += "Quantidade de pessoas: " + getJogadores().size() + "\n";
		
		return out;
	}

	
	@Override
	/**
	 * Verifica a igualdade entre 2 grupos
	 * @return
	 * 		True, se os grupos forem iguais. False, caso contrario
	 */
	public boolean equals(Object obj) {
		
		if  (!(obj instanceof Grupo)){
			return false;
		}
		
		if (obj == null){
			return false;
		}
		
		Grupo g1 = (Grupo) obj;
		
		if (!(getDono().equals(g1.getDono()) && (getNome().equals(g1.getNome())))){
			return false;
		}
		
		return true;
	}
	
}
